#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：spider_learning 
@File ：bilibili_video_downloader.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/11/13 下午1:54 
"""

import os
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
import subprocess


# 视频下载函数
def download_video(vid: str, save_path: str) -> None:
	"""
	下载单个 Bilibili 视频。

	:param vid: 视频的 AV 号或 BV 号
	:param save_path: 视频保存路径
	"""
	# 使用 youtube-dl 下载视频
	command = f"youtube-dl -f best 'https://www.bilibili.com/video/{vid}' -o '{save_path}/%(title)s.%(ext)s'"
	subprocess.run(command, shell=True)


# 读取文本文件并下载视频
def download_videos_from_file(file_path: str, save_dir: str) -> None:
	"""
	从文本文件中读取视频链接并下载视频。

	:param file_path: 包含视频链接的文本文件路径
	:param save_dir: 视频保存目录
	"""
	with open(file_path, 'r', encoding='utf-8') as file:
		video_links = file.read().splitlines()

	# 根据文件名创建文件夹
	file_name = os.path.basename(file_path).split('.')[0]
	save_path = os.path.join(save_dir, file_name)
	os.makedirs(save_path, exist_ok=True)

	# 下载视频
	for vid in tqdm(video_links, desc=f"Downloading videos for {file_name}"):
		vid = vid.split('/')[-2]
		download_video(vid, save_path)


# 主函数
def main(download_dir: str) -> None:
	"""
	主函数，读取指定目录下的所有 txt 文件并下载视频。

	:param download_dir: 包含视频链接的 txt 文件目录
	"""
	data_dir = 'data'  # 数据文件夹
	os.makedirs(data_dir, exist_ok=True)

	# 遍历下载目录下的所有 txt 文件
	for file_name in os.listdir(download_dir):
		if file_name.endswith('.txt'):
			file_path = os.path.join(download_dir, file_name)
			download_videos_from_file(file_path, data_dir)


if __name__ == '__main__':
	download_directory = r'E:\work_files\projects\spider_learning\bilibili_video_url_spider\url_source_data'  # 指定你的 txt 文件目录
	main(download_directory)
